package com.heima.pd.interceptor;

import com.heima.pd.common.dtos.AppHttpCodeEnum;
import com.heima.pd.common.dtos.ResponseResult;
import com.heima.pd.common.utils.AppJwtUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
@Slf4j
public class MyInterceptor implements HandlerInterceptor {

    /* HandlerInterceptor 这个接口中的方法都有默认实现 */
    /* 我们要使用哪个就重写哪个 */
    /* 在请求到达目标资源之前干一些事  */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /* 返回是 false  请求就不会放行 也不会到达目标资源 */
        /* 返回是 true  请求就会放行 会到达目标资源 */
        /* request 进行增强操作 判断你是否携带了某个请求头 如果有就放行 如果没有就返回 */
        /* response 一般在响应回去之前用的到  请求到达目标资源之前用不上 */
        /* handler 代表的是我们要去访问的资源 某个Controller中的某个方法  UserController 中的 findUserById 这个方法 */
        System.out.println("请求走了拦截器....");
        //token校验
        HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(request);
        //得到请求参数中的token值
        //3.获取当前用户的请求头jwt信息
        String jwtToken = requestWrapper.getHeader("token");
       // HttpHeaders headers = (HttpHeaders) request.getHeaders("token");
        //String jwtToken = headers.getFirst("token");

        //4.判断当前令牌是否存在
        if(StringUtils.isEmpty(jwtToken)){
            //如果不存在，向客户端返回错误提示信息
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }

        try {
            //5.如果令牌存在，解析jwt令牌，判断该令牌是否合法，如果不合法，则向客户端返回错误信息
            Claims claims = AppJwtUtil.getClaimsBody(jwtToken);
            int result = AppJwtUtil.verifyToken(claims);
            if(result == 0 || result == -1){
                //5.1 合法，则向header中重新设置userId
                Integer id = (Integer) claims.get("id");
                log.info("find userid:{} from uri:{}",id,request.getRequestURI());
                //重新设置token到header中
                requestWrapper.addHeader("token",jwtToken);
            }else{
                //token失效 拦截
                ResponseResult.errorResult(AppHttpCodeEnum.TOKEN_EXPIRE);
                return false;
            }
        }catch (Exception e){
            e.printStackTrace();
            //向客户端返回错误提示信息
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }

        //6.放行
        return true;
    }

}